/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package op.filtros;

import core.FiltraLigacao;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import op.ContaTelefonica;
import op.Ligacao;

/**
 *
 * @author Jônatas
 */
public class FiltraPorHora implements FiltraLigacao {

    private int horaInicio;
    private int minutoInicio;
    private int horaFim;
    private int minutoFim;

    public FiltraPorHora(int horaInicio, int minutoInicio, int horaFim, int minutoFim) {
        this.horaInicio = horaInicio;
        this.minutoInicio = minutoInicio;
        this.horaFim = horaFim;
        this.minutoFim = minutoFim;
    }


    public ContaTelefonica execute(ContaTelefonica contaOriginal) {
        List<Ligacao> ligacoesOriginais = contaOriginal.getLigacoes();
        List<Ligacao> ligacoesHora = new ArrayList<Ligacao>();


        for (Ligacao ligacao : ligacoesOriginais) {

            Date date = ligacao.getDataOrigemLigacao();

            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);

            int horaLigacao = calendar.get(Calendar.HOUR_OF_DAY);
            int minLigacao = calendar.get(Calendar.MINUTE);

            if (horaInicio < horaFim) {

                if (horaInicio < horaLigacao || ((horaInicio == horaLigacao) && (minutoInicio <= minLigacao))) {
                    if (horaLigacao < horaFim || ((horaFim == horaLigacao) && (minLigacao < minutoFim))) {
                        ligacoesHora.add(ligacao);
                    }
                }

            } else if (horaInicio > horaFim) {

                if ((horaInicio < horaLigacao) || ((horaInicio == horaLigacao) && (minutoInicio <= minLigacao)) ||
                        ((horaLigacao < horaInicio) && ((horaLigacao < horaFim) || ((horaLigacao == horaFim) && (minLigacao < minutoFim))))) {
                    ligacoesHora.add(ligacao);
                }

            } else {

                if(minutoInicio < minutoFim) {

                    if((horaLigacao == horaInicio) && (minutoInicio <= minLigacao) && (minLigacao < minutoFim)) {
                        ligacoesHora.add(ligacao);
                    }

                } else if(minutoInicio > minutoFim) {

                    if(horaInicio != horaLigacao) {
                        ligacoesHora.add(ligacao);
                    } else {
                        if(minutoInicio <= minLigacao) {
                            ligacoesHora.add(ligacao);
                        }
                    }

                }


            }


        }

        ContaTelefonica resposta = new ContaTelefonica(contaOriginal.getContaMensal());
        resposta.setLigacoes(ligacoesHora);
        return resposta;
    }

}
